package template_method_pattern;

/**
 * 核心模板
 *
 * @author wangzg13
 * @since 2022/8/5
 */
public abstract class AbstractTemplate {

    //属性
    //可以定义一些不重要的属性，和寻常抽象类一样
    protected int count;


    //方法
    //更多的protected，对实现类友好
    protected abstract String strOperMethod();

    protected abstract void soutMethod(String param);


    /**
     * 模板方法扩展，钩子函数
     *
     * 子类可以选择是否复写
     * @return
     */
    protected boolean isContact(){
        return true;
    }

    /**
     * 核心方法
     * <p>
     * 使用public关键词没有什么意义，因为抽象类的实现与引用最终是交由实现子类
     * <p>
     * 使用final限制重写
     */
    protected final void core() {
        String str = strOperMethod();
        if (isContact()){
            // 可以用反射获取方法被谁调用了
            System.out.println("扩展方法（钩子函数约束）");
            str = null;
        }
        soutMethod(str);
    }
}
